var http = require('http');

http.createServer(function(req, res) {
	res.writeHead(200, {'Content-Type': 'text/html'});
	res.write('<h1> Node.js</h1>');
	res.end('<p>Hello World</p>');
}).listen(3000);


1.http.Server的事件
	1.request ：当客户端请求到来时，该事件被触发，提供两个参数 req 和 res ，分别是
		http.ServerRequest 和 http.ServerResponse 的实例，表示请求和响应信息。
	2.connection ：当 TCP 连接建立时，该事件被触发，提供一个参数 socket ，为
		net.Socket 的实例。 connection 事件的粒度要大于 request ，因为客户端在
		Keep-Alive 模式下可能会在同一个连接内发送多次请求。
	3.close ：当服务器关闭时，该事件被触发。注意不是在用户连接断开时。
		除此之外还有 checkContinue 、 upgrade 、 clientError 事件，通常我们不需要关
		心，只有在实现复杂的 HTTP 服务器的时候才会用到。
2.http.ServerRequest: 请求头<RequestHeader>和请求体<Request Body>
	//提供三个事件控制请求体传输
	1.data ：当请求体数据到来时，该事件被触发。该事件提供一个参数 chunk ，表示接	
	  收到的数据。如果该事件没有被监听，那么请求体将会被抛弃。该事件可能会被调用多次。

 	2.end ：当请求体数据传输完成时，该事件被触发，此后将不会再有数据到来。
  3.close ： 用户当前请求结束时，该事件被触发。不同于 end ，如果用户强制终止了
		传输，也还是调用 close 。
	//ServerRequest的属性
	1.complete: 	客户端请求是否已经发送完成
	2.httpVersion: 	HTTP 协议版本，通常是 1.0 或 1.1
	3.method: 		HTTP 请求方法，如 GET、POST、PUT、DELETE 等
	4.url: 			原始的请求路径，例如 /static/image/x.jpg 或 /user?name=byvoid
	5.headers: 		HTTP 请求头
	6.trailers: 	HTTP 请求尾（不常见）
	7.connection: 	当前 HTTP 连接套接字，为 net.Socket 的实例
	8.socket: 		connection 属性的别名
	9.client: 		client 属性的别名

3.获取GET请求内容
	var url = require('url');
	var util = require('util');

	http.createServer(function(req, res) {
		res.writeHead(200, {'Content-Type': 'text/plain'});
		res.end(util.inspect(url.parse(req.url, true)));
	}).listen(3000);

	var urlstr = "http://127.0.0.1:3000/user?name=byvoid&email=byvoid@byvoid.com"
	{
		search: '?name=byvoid&email=byvoid@byvoid.com',
		query: {name: 'byvoid', emial: 'byvoid@byvoid.com'},
		pathname: '/user',
		path: '/user?name=byvoid&email=byvoid@byvoid.com',
		href: '/user?name=byvoid&email=byvoid@byvoid.com'
	}

4.获取POST请求内容
	var querystring = require('querystring');

	http.createServer(function(req, res) {
		var post = '';
		req.on('data', function(chunk) {
			post += chunk;
		})

		req.on('end', function() {
			post = querystring.parse(post);
			res.end(util.inspect(post));
		})
	}).listen(3000);

5.http.ServerResponse
	1.response.writeHead(statusCode, [headers]) ：向请求的客户端发送响应头。
		statusCode 是 HTTP 状态码，如 200 （请求成功）、404 （未找到）等。 headers
		是一个类似关联数组的对象，表示响应头的每个属性。该函数在一个请求内最多只
		能调用一次，如果不调用，则会自动生成一个响应头。
	2.response.write(data, [encoding]) ：向请求的客户端发送响应内容。 data 是
		一个 Buffer 或字符串，表示要发送的内容。如果 data 是字符串，那么需要指定
		encoding 来说明它的编码方式，默认是 utf-8 。在 response.end 调用之前，
		response.write 可以被多次调用。
	3.response.end([data], [encoding]) ：结束响应，告知客户端所有发送已经完
		成。当所有要返回的内容发送完毕的时候，该函数 必须 被调用一次。它接受两个可
		选参数，意义和 response.write 相同。如果不调用该函数，客户端将永远处于
		等待状态


客户端http访问：
1.http.request(options, callback);  返回一个http.ClientRequest的实例
	options常用参数：
		1.host: 请求网站的域名或ip
		2.port: 端口号
		3.method: 请求方法，默认是GET
		4.path: 请求相对于根的路径,默认是'/'； 例如: '/search?query=byvoid'
		5.headers: 一个关联数组对象，为请求头的内容

2.http.get(options, callback); 返回一个http.ClientRequest的实例
	 http.get自动将请求方法设为了 GET 请求，同时不需要手动调用 req.end() 


	reqeust.abort(); 终止正在发送的请求
	request.setTimeout(timeout, [callback]); 请求超时后回调会被调用;
3.http.ClientResponse的实例
	statusCode HTTP 状态码，如 200、404、500
	httpVersion HTTP 协议版本，通常是 1.0 或 1.1
	headers HTTP 请求头
	trailers HTTP 请求尾（不常见）

	response.setEncoding([encoding]); 设置编码； 默认以buffer形式存储
	response.pause(); 暂停接受数据和发送事件,方便实现下载功能
	response.resume(); 从暂停状态恢复
	